package cn.iocoder.yudao.module.im.dal.mysql.message;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.im.controller.app.message.vo.AppMessagePageReqVO;
import cn.iocoder.yudao.module.im.dal.dataobject.message.MessageDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 消息 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface MessageMapper extends BaseMapperX<MessageDO> {

    /**
     * 更新聊天标识下所有消息的最新状态为非最新
     *
     * @param chatIdentify 聊天标识
     */
    @Update("UPDATE im_message SET is_last = 0 WHERE chat_identify = #{chatIdentify}")
    void updateIsLastByChatIdentify(String chatIdentify);

    /**
     * 分页查询消息列表
     *
     * @param pageReqVO 分页查询条件
     * @param userId 当前用户ID
     * @return 消息分页列表
     */
    default PageResult<MessageDO> selectMessagePage(AppMessagePageReqVO pageReqVO, Long userId) {
        String chatIdentify = generateChatIdentify(userId, pageReqVO.getToContactId(), pageReqVO.getIsGroup());
        return selectPage(pageReqVO, new LambdaQueryWrapperX<MessageDO>()
                .eq(MessageDO::getChatIdentify, chatIdentify)
                .orderByDesc(MessageDO::getId));
    }

    /**
     * 批量更新消息已读状态
     *
     * @param messageIds 消息ID列表
     * @param isRead 已读状态
     */
    @Update("<script>" +
            "UPDATE im_message SET is_read = #{isRead} WHERE id IN " +
            "<foreach collection='messageIds' item='id' open='(' close=')' separator=','>" +
            "#{id}" +
            "</foreach>" +
            "</script>")
    void updateMessageReadStatus(@Param("messageIds") List<Long> messageIds, @Param("isRead") Integer isRead);

    /**
     * 根据聊天标识和发送者更新消息已读状态
     *
     * @param chatIdentify 聊天标识
     * @param fromUserId 发送者用户ID
     * @param isRead 已读状态
     */
    @Update("UPDATE im_message SET is_read = #{isRead} WHERE chat_identify = #{chatIdentify} AND from_user_id = #{fromUserId}")
    void updateMessageReadStatusByChatIdentifyAndFromUser(@Param("chatIdentify") String chatIdentify, 
                                                         @Param("fromUserId") Long fromUserId, 
                                                         @Param("isRead") Integer isRead);

    /**
     * 生成聊天标识
     *
     * @param fromUserId 发送者用户ID
     * @param toUserId 接收者用户ID
     * @param isGroup 是否群聊
     * @return 聊天标识
     */
    default String generateChatIdentify(Long fromUserId, Long toUserId, Integer isGroup) {
        if (isGroup != null && isGroup == 1) {
            // 群聊标识：group-{groupId}
            return "group-" + toUserId;
        } else {
            // 单聊标识：小的用户ID在前
            long minId = Math.min(fromUserId, toUserId);
            long maxId = Math.max(fromUserId, toUserId);
            return minId + "-" + maxId;
        }
    }

}